/*
 * =====================================================================================
 *
 *       Filename:  exec.c
 *
 *    Description:  execute cmd
 *
 *        Version:  1.0
 *        Created:  2013年11月15日 19时16分25秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  BeeSui Xue (BX), xuejilong@foxmail.com
 *        Website:  http://beesui.com
 *        License:  GNU General Public License
 *   Organization:  Free Person
 *
 * =====================================================================================
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

extern char **environ;

/*
 * 执行命令
 * 参数一：命令行格式的字符串
 * 参数二：带回参数一的命令执行的结果字符串
 */
int execute_cmd(const char *cmd, char *result)
{
    char buf_ps[1024];
    char ps[1024]={0};
    FILE *ptr;
    int error_num = 0;
    int total_len = 0, buf_ps_len = 0, result_len = 0;

	//将result内容全部清0,防止垃圾数据导致结果错误
	bzero(result, 1024);

	//拷贝命令字符串
    strcpy(ps, cmd);
	//执行命令
    if((ptr=popen(ps, "r"))!=NULL)
    {
		//从命令执行结果的缓存中读取数据
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
            buf_ps_len = strlen(buf_ps);
            total_len += buf_ps_len;
            if(total_len<=1024){
                strcat(result, buf_ps);  
                result_len += buf_ps_len;
            }
        }
        pclose(ptr);
        ptr = NULL;

		//如果命令结果长度大于1024则只读取1024字节，其他的丢弃
        if(total_len>1024){
            printf("total_len = %d, result_len = %d\n",
                    total_len, result_len);
        }
    }
    else
    {
		//如果上面的命令执行错误，则返回错误号
        error_num = errno;
        perror("popen error");
    }

    return error_num;
}

